package com.qingxin.sys.utils;

import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

/**
 * JDON工具类
 * @author Administrator
 *
 */
public class JsonUtil {

	
	/**
	 * 转换指定对象为JSON字符串
	 * @param object
	 * @return
	 */
	public static String toJSON(Object object){
		GsonBuilder gsonBuilder = new GsonBuilder();
		gsonBuilder.serializeNulls();
		return gsonBuilder.create().toJson(object);
	}
	
	
	/**
	 * 将JSON解析为Java对象
	 * @param jsonString
	 * @param rootClass
	 * @return
	 */
	public static <T> T parse(String jsonString, Class<T> rootClass){
		return (new Gson()).fromJson(jsonString, rootClass);
	}
	
	
	/**
	 * 将JSON数组解析为List对象
	 * @param jsonString
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static <T> List<T> toList(String jsonString){
		List<T> list = (new Gson()).fromJson(jsonString, java.util.List.class);
		return list;
	}
	

	/**
	 * 将JSON数组解析为List对象
	 * @param jsonString
	 * @param type 用于指定泛型类型，格式： new TypeToken< List< EntityType>>(){}.getType()
	 * @return
	 */
	public static <T> List<T> toList(String jsonString, Type type){
		List<T> list = (new Gson()).fromJson(jsonString, type);
		return list;
	}
	
	
	/**
	 * 将JSON对象解析为Map
	 * @param jsonString
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static <K, V> Map<K, V> toMap(String jsonString){
		Map<K, V> map = (new Gson()).fromJson(jsonString, java.util.Map.class);
		return map;
	}
	
	
	/**
	 * 将JSON对象解析为Map
	 * @param jsonString
	 * @param type 用于指定泛型类型，格式： new TypeToken< Map< KeyType, ValueType>>(){}.getType()
	 * @return
	 */
	public static <K, V> Map<K, V> toMap(String jsonString, Type type){
		Map<K, V> map = (new Gson()).fromJson(jsonString, type);
		return map;
	}
	
	
	/**
	 * 转义特殊字符生成JSON中的字符串常量
	 * @param string
	 * @return
	 */
	public static String getJSONString(String string){
		if(string==null){
			return "null";
		}
		if(string.length() == 0){
			return "";
		}
		int len = string.length();
		StringBuilder buf = new StringBuilder();
		char chars[] = string.toCharArray();
		char c = '\0';
		for(int i = 0; i < len; i++){
			char b = c;
			c = chars[i];
			switch(c){
			case 34: // '"'
			case 92: // '\\'
				buf.append('\\');
				buf.append(c);
				break;
			case 47: // '/'
				if(b == '<'){
					buf.append('\\');
				}
				buf.append(c);
				break;
			default:
				if(c < ' '){
					switch(c){
					case 8: // '\b'
						buf.append('\\');
						buf.append('b');
						break;
					case 9: // '\t'
						buf.append('\\');
						buf.append('t');
						break;
					case 10: // '\n'
						buf.append('\\');
						buf.append('n');
						break;
					case 12: // '\f'
						buf.append('\\');
						buf.append('f');
						break;
					case 13: // '\r'
						buf.append('\\');
						buf.append('r');
						break;
					case 11: // '\013'
					default:
						buf.append(String.format("\\u%04x", (int)c));
						break;
					}
				}else {
					buf.append(c);
				}
				break;
			}
		}
		return buf.toString();
	}
	
	
	
}
